package com.sunxiansheng.oss.adapter;

import com.sunxiansheng.oss.entity.FileInfo;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.List;

/**
 * StorageAdapter接口定义了与对象存储服务交互的方法。
 * 这些方法提供了基本的存储操作，如创建存储桶、上传和下载文件、获取文件信息等。
 * @Author sun
 * @Create 2024/5/31 10:03
 * @Version 1.0
 */
public interface StorageAdapter {

    /**
     * 创建存储桶。
     * 如果指定名称的存储桶不存在，则创建它。
     *
     * @param bucket 存储桶的名称
     */
    void createBucket(String bucket);

    /**
     * 上传文件到指定存储桶。
     *
     * @param uploadFile 要上传的文件
     * @param bucket 存储桶的名称
     * @param objectName 对象名称，即文件在存储桶中的名称
     */
    String uploadFile(MultipartFile uploadFile, String bucket, String objectName);

    /**
     * 获取所有存储桶的名称列表。
     *
     * @return 存储桶名称的列表
     */
    List<String> getAllBucket();

    /**
     * 获取指定存储桶中的所有文件信息。
     *
     * @param bucket 存储桶的名称
     * @return 文件信息列表，其中包含文件名、是否为目录标志和ETag
     */
    List<FileInfo> getAllFile(String bucket);

    /**
     * 从指定存储桶下载文件。
     *
     * @param bucket 存储桶的名称
     * @param objectName 对象名称，即文件在存储桶中的名称
     * @return 文件输入流，用于读取下载的文件内容
     */
    InputStream downLoad(String bucket, String objectName);

    /**
     * 删除指定存储桶。
     * 注意：存储桶必须为空才能被删除。
     *
     * @param bucket 存储桶的名称
     */
    void deleteBucket(String bucket);

    /**
     * 删除指定存储桶中的文件。
     *
     * @param bucket 存储桶的名称
     * @param objectName 对象名称，即要删除的文件在存储桶中的名称
     */
    void deleteObject(String bucket, String objectName);

    /**
     * 获取文件的访问URL。
     * 该URL可以用于在浏览器中查看或下载文件。
     * @param originalFilename 原始文件名
     * @param bucket 存储桶的名称
     * @param objectName 对象名称，即文件在存储桶中的名称
     * @return 文件的URL
     */
    public String getUrl(String originalFilename, String bucket, String objectName);
}